import java.net.URL;

public class Test {
    public static void main(String[] args) {

        // 前端浏览器 控制台 搜索想要的数据
        // 按下 ctrl + F

        // ****  自动化测试selenium篇 ****
        // 1.自动化相关的理论
        /**
         *  自动化测试介绍
         */
        // 什么是自动化测试
        // 自动化测试就相当于将人工测试手段进行转换，让代码去执行
        //  自动化分类
        //      单元测试，接口测试，UI自动化测试
        //  自动化测试金字塔


        // 2. 实操（selenium+Junit）
        // *** selenium 介绍 ***
        // 1.selenium 是什么
            /*
            selenium 是用来做 web 自动化测试框架
             */
        // 2.selenium的特点
        /**
         *  支持各种浏览器， 支持各种平台， 支持各种语言（python，java，C#）
         */

        // 3.工作原理（*）
        /**
         *
         *  桌面保存的图片
         *
         *  里面有三个角色， 第一个角色： 自动化脚本代码： 通过idea 编写的代码
         *
         *
         *  第二个角色： webdriver浏览器驱动，需要去下载的
         *
         *  第三个角色：浏览器
         *
         */


        // selenium + Java 环境搭建
        // 首先下载Chrome浏览器， 并查看 chrome浏览器的版本， 此处版本为 122.0 （只需要前两位就好）
        // 下载 chrome 浏览器驱动 (准备好maven 配置环境， 准备好 环境变量的配置)

        // 接下来 需要 掌握将详细的介绍 webdriver 常用的 API
        // click
        // send
        // getText
        // getUrl
        // getTitle

        // **** webdriver API *****
        // 这需要先解释一下 测试包里面的 介绍 test_3_13_Test

        // ***** 元素的定位 ****
        // 也是最重要的一个部分
        // CSS定位
        // XPath定位

        // 定位元素通过 findElement

        // CSS 选择语法
        // id 选择器：#id
        // 类选择器， .class 名
        // 标签选择器  标签名
        // 后代选择器  父级选择器  子级选择器
        // xpath 分为两种
        // 绝对路径：/html 开头 （不常用）
        // 相对路径： // （双斜杠开头）
        //            相对路径 + 索引  如： 在网页控制台中搜索 //from/span[1]/input
        //            相对路径 + 属性值  如： //input[@class="s_ipt"]  或者 //input[@id="su"]
        //            相对路径 + 通配符   基于第二种写法的简写： 如：//*[*"s_ipt"]  表示不管哪个标签下，只要有这个属性都可以找到
        //            相对路径 + 文本匹配. 如： //a[text()="新闻"]
        // 以上都是以 百度网页的 搜索框来介绍的
        // 接下来返回代码部分来解释

        // CSS选择器 和 xpath选择器 的区别是什么呢？
        // 推荐使用哪一种呢？
        // CSS选择器
        // CSS选择器定位元素的效率跟高的

        // 接下来看看常用的操作
        // 操作测试对象
        //click 点击对象
        //send_keys 在对象上模拟按键输入
        //clear 清除对象输入的文本内容
        //submit 提交 (如果放在 form 标签中， 此时的作用和 click 一样， 如果不是放在form标签中，此时 submit 会报错)
        //text 用于获取元素的文本信息
        //getAttribute获取元素对应的属性的值


        // 面试题： 自动化测试，验证码没法登录， 哦屏蔽掉被单独手动测试吗？
        // 答：
        // 自动化测试账号加一个白名单
        // 自动化测试账号加一个白名单
        // 自己设定一个账号密码（...，...）
        // 如果登录的对，此时就不需要验证码处理


        // *** 添加等待 ***
        //sleep休眠 （强制等待）
        //添加休眠非常简单，我们需要引入time 包，就可以在脚本中自由的添加休眠时间了，这里的休眠指固定休眠

        //隐式等待
        //通过添加implicitly_wait() 方法就可以方便的实现智能等待；implicitly_wait(30)的用法比time.sleep()
        //更智能，后者只能选择一个固定的时间的等待，前者可以在一个时间范围内智能的等待。


        // 等待
        // 这两个等待的区别

        // 假设等待三天时间
        // 如果等待时间3天时间， 强制等待一直等待，等待的时间3天
        // 隐式等待， 最常等待3天，如果等待3天之内获取到页面上的元素，此时执行下面的代码
        // 如果等待 3 天时间还是没有找到哪个元素，此时就报错

        // 打印信息

        // 打印title
        // 打印url

        // 1.selenium 常见 ApI
        // 等待： sleep

        // 隐式等待， 与 显示等待的区别
        // 隐式地等待并非一个固定的等待时间，当脚本执行到某个元素定位时，如果元素可以定位，则继续执
        //行；如果元素定位不到，则它以轮询的方式不断的判断元素是否被定位到。直到超出设置的时长
        //
        // 隐式等待等待的是所有的元素
        // 显示等待 是等待一个固定的条件， 这个条件是程序设定的

        // 浏览器操作
        // 1.浏览器前进
        // 2.浏览器后退
        // 3.浏览器滚动条操作

        // 4.定位一组元素
        // webdriver 可以很方便的使用findElement 方法来定位某个特定的对象，不过有时候我们却需要定位一
        //组对象，这时候就需要使用findElements 方法。
        //定位一组对象一般用于以下场景：
        //      批量操作对象，比如将页面上所有的checkbox 都勾上
        //      先获取一组对象，再在这组对象中过滤出需要具体定位的一些对象。比如定位出页面上所有的
        //checkbox，然后选择最后一个
        // 5.多层框架/窗口定位
        // 对于一个web 应用，经常会出现框架（frame） 或窗口（window）的应用，这也就给我们的定位带来
        //了一定的困难。
        //      定位一个frame ：switch_to.frame(name_or_id_or_frame_element)
        //      定位一个窗口window：switch_to.window(name_or_id_or_frame_element)
        /*
          多层框架的定位
            switch_to.frame(name_or_id_or_frame_element)：通过frame的id或者name或者frame自带的其它
            属性来定位框架，这里switch_to.frame()把当前定位的主体切换了frame里。
            switch_to.default_content：从frame中嵌入的页面里跳出，跳回到最外面的默认页面中。
         */
        // 多层窗口定位
        // 有可能嵌套的不是框架，而是窗口，还有真对窗口的方法：switch_to.window
        //      用法与switch_to.frame 相同：
        //      driver.switch_to.window("windowName")
        // 6. 针对弹窗的处理
        //

        // 7. 上传文件

        // 2.针对特殊的场景如何通过 SeleniumAPI完成
        // 3.补充
        // 关闭浏览器
        //浏览器 quit  和 close 之间的区别
        // 1） quit操作关闭了整个浏览器， close 只是关闭了当前页面
        // 2） quit操作会清空对应的缓存 cookies 给清理掉， close 不会清空缓存

        // 切换窗口

        // 截图操作
        // 需要添加响应的 maven 依赖
        // 在maven 中央仓库中 搜索 common-io 然后选择第一个， 再选择使用量高的 ， 然后 添加依赖

    }
}
